package com.sqlcheck.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sqlcheck.dto.request.CreateScanTaskRequest;
import com.sqlcheck.dto.response.ScanTaskResponse;
import com.sqlcheck.entity.ScanTask;
import com.sqlcheck.enums.TaskStatus;

import java.util.List;
import java.util.Map;

public interface ScanTaskService {

    ScanTaskResponse createTask(CreateScanTaskRequest request, Long userId);

    // 新方法 - 带权限检查
    ScanTaskResponse getTaskById(Long taskId, Long currentUserId);

    // 原方法 - 向后兼容，内部调用新方法
    default ScanTaskResponse getTaskById(Long taskId) {
        return getTaskById(taskId, null);
    }

    // 内部方法
    ScanTask getTaskByIdInternal(Long taskId);

    // 新方法 - 带权限检查
    IPage<ScanTaskResponse> getTasksByUserId(Long userId, Page<ScanTask> page, Long currentUserId);

    // 原方法 - 向后兼容
    default IPage<ScanTaskResponse> getTasksByUserId(Long userId, Page<ScanTask> page) {
        return getTasksByUserId(userId, page, userId);
    }

    // 新方法 - 带权限检查
    List<ScanTaskResponse> getTasksByProjectId(Long projectId, Long currentUserId);

    // 原方法 - 向后兼容
    default List<ScanTaskResponse> getTasksByProjectId(Long projectId) {
        return getTasksByProjectId(projectId, null);
    }

    ScanTaskResponse updateTaskStatus(Long taskId, TaskStatus status, Integer progress);

    ScanTaskResponse updateTaskError(Long taskId, String errorMessage);

    void deleteTask(Long taskId, Long userId);

    void startTask(Long taskId);

    void cancelTask(Long taskId);

    /**
     * 重试失败的任务
     * 
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 重试后的任务信息
     */
    ScanTaskResponse retryTask(Long taskId, Long userId);

    /**
     * 检查任务是否可以重试
     * 
     * @param taskId 任务ID
     * @return 是否可以重试
     */
    boolean canRetry(Long taskId);

    /**
     * 检查任务凭证有效期
     * 
     * @param taskId 任务ID
     * @return 凭证状态信息
     */
    Map<String, Object> checkTaskCredentials(Long taskId);

    List<ScanTaskResponse> getRunningTasks();

    /**
     * 根据任务ID查找任务实体
     * 
     * @param taskId 任务ID
     * @return 任务实体
     */
    ScanTask findById(Long taskId);

    /**
     * 更新任务的提取统计信息
     * 
     * @param taskId          任务ID
     * @param extractionStats 提取统计信息
     */
    void updateTaskExtractionStats(Long taskId, Map<String, Object> extractionStats);

    /**
     * 更新任务的AI分析状态
     * 
     * @param taskId 任务ID
     * @param status AI分析状态
     */
    void updateTaskAIAnalysisStatus(Long taskId, String status);

    /**
     * 更新任务的AI分析开始时间
     * 
     * @param taskId 任务ID
     */
    void updateTaskAIAnalysisStartTime(Long taskId);

    /**
     * 更新任务的AI分析完成信息
     * 
     * @param taskId            任务ID
     * @param processedSqlCount 处理的SQL数量
     * @param duration          处理时长（毫秒）
     */
    void updateTaskAIAnalysisCompleted(Long taskId, Integer processedSqlCount, Long duration);

    /**
     * 更新任务的AI分析跳过信息
     * 
     * @param taskId 任务ID
     * @param reason 跳过原因
     */
    void updateTaskAIAnalysisSkipped(Long taskId, String reason);

}